export default function (fn, interval = 1000, options = { leading: true, trailing: false, cb: () => { } }) {
  const { leading, trailing, cb } = options
  let lastTime = 0
  let timer = null

  function _throttle(...args) {
    return new Promise((resolve, reject) => {
      let nowTime = Date.now()
      // 不需要立即执行
      if (!leading && lastTime === 0) {
        // 设置第一次启动时间
        lastTime = nowTime
      }

      const remainTime = interval - (nowTime - lastTime)
      if (remainTime <= 0) {
        timer && clearTimeout(timer)
        timer = null

        const res = fn.apply(this, args)
        lastTime = nowTime
        cb && cb(res)
        resolve(res)
        // 执行了函数，就不需要再加定时器
        return
      }
      // 没有定时器 和需要最后一次执行 才加
      if (!timer && trailing) {
        timer = setTimeout(() => {
          timer = null
          // 定时器里如果执行了 让时间线上的 函数无法执行
          lastTime = !leading ? 0 : Date.now()
          const res = fn.apply(this, args)
          cb && cb(res)
          resolve(res)
        }, remainTime)
      }
    })
  }

  _throttle.cancel = function () {
    console.log('节流函数已取消~')
    timer && clearTimeout(timer)
    timer = null
    lastTime = 0
  }

  return _throttle
}